<?php

class App
{
    /** @var array */
    public array $get;

    /** @var array */
    public array $post;

    /** @var array */
    public array $server;

    /** @var string */
    public string $method;

    /** @var string */
    public string $uri;

    /** @var string */
    public string $body;

    /** @var array */
    public array $cookies;

    /** @var array */
    public array $headers;

    public function __construct()
    {
        $this->get     = $_GET ?? [];
        $this->post    = $_POST ?? [];
        $this->server  = $_SERVER ?? [];
        $this->method  = $this->server['REQUEST_METHOD'] ?? 'GET';
        $this->uri     = parse_url($this->server['REQUEST_URI'] ?? '/', PHP_URL_PATH);
        $this->body    = file_get_contents('php://input') ?: '';
        $this->cookies = $_COOKIE ?? [];
        $this->headers = function_exists('getallheaders') ? getallheaders() : [];
    }

    public function run()
    {
        echo '<pre>';
        var_dump($this->uri);
        echo '</pre>';
    }

    /**
     *  路由解析
     * @return array
     */
    private function router(): array
    {
        // 使用 filter_input 代替直接访问 $_GET，以提高安全性
        $path = filter_input(INPUT_GET, 'pathInfo', FILTER_SANITIZE_STRING);

        // 如果 pathInfo 不存在，则设置默认路径
        if (!$path) {
            $path = 'index/index';
        }

        // 移除文件后缀
        if (defined('PG_SUFFIX') && PG_SUFFIX) {
            $path = str_replace(PG_SUFFIX, '', $path);
        }

        // 将路径分割成数组
        $router = explode('/', $path);

        // 如果第一个元素为空，移除它
        if (empty($router[0])) {
            array_shift($router);
        }

        // 如果启用了自定义路由，使用路由数组进行映射
        if (defined('PG_ROUTE') && PG_ROUTE) {
            $routerArray = require(PG_PATH . '/router.php');

            // 如果路由匹配，返回对应的路由信息
            if (isset($routerArray[$router[0]])) {
                $routeInfo = $routerArray[$router[0]];
                $newRouter = array_merge(
                    [$routeInfo[0], $routeInfo[1]],
                    $routeInfo[2] ?? [] // 如果有额外的路由参数，合并它们
                );

                // 定义当前为页面请求
                define("PG_PAGE", 1);
                return $newRouter;
            }
        }

        // 默认控制器和方法
        $router[0] = $router[0] ?? 'index';  // 默认控制器
        $router[1] = $router[1] ?? 'index';  // 默认方法

        // 处理分页参数
        for ($i = 2; $i < count($router); $i++) {
            if (preg_match('/^page_(\d+)(' . PG_SUFFIX . ')*$/Ui', $router[$i], $matches)) {
                define("PG_PAGE", intval($matches[1]));
                array_splice($router, $i, 1);
            }
        }

        // 如果没有定义 PG_PAGE，则默认第一页
        if (!defined("PG_PAGE")) {
            define("PG_PAGE", 1);
        }

        return $router;
    }
}
